// 1. 变量声明方式
function demo() {
    
    var a = "我是 var";  // 函数作用域
    let b = "我是 let";  // 块级作用域
    const c = "我是 const";  // 块级作用域，且不可变

    if (true) {
        var x = 10;  // 仍然可以在函数内访问
        let y = 20;  // 仅在此块内有效
        const z = 30;  // 仅在此块内有效
    }

    console.log(x);  // 10 （var 仍然有效）
    // console.log(y);  // 报错：y 仅在块内可用
    // console.log(z);  // 报错：z 仅在块内可用
}

demo();

// 2. 数据类型
let str = "Hello";  // 字符串
let num = 42;  // 数字
let bool = true;  // 布尔值
let undef;  // 未定义
let empty = null;  // 空值
let sym = Symbol("唯一值");  // Symbol 类型

console.log(typeof str);  // "string"
console.log(typeof num);  // "number"
console.log(typeof bool);  // "boolean"
console.log(typeof undef);  // "undefined"
console.log(typeof empty);  // "object" （JavaScript 的历史遗留问题）
console.log(typeof sym);  // "symbol"

// 3. 引用类型
let obj = { name: "Alice", age: 25 };  // 对象
let arr = [1, 2, 3];  // 数组
let func = function() { return "我是函数"; };  // 函数

console.log(typeof obj);  // "object"
console.log(typeof arr);  // "object"
console.log(typeof func);  // "function"